home *** CD-ROM | disk | FTP | other *** search
- /* -*-C-*- readpk.h */
- /*-->readpk*/
- /**********************************************************************/
- /******************************* readpk *******************************/
- /**********************************************************************/
-
- int
- readpk() /* return 0 on success, EOF on failure */
- {
- UNSIGN32 checksum;
- long end_of_packet; /* pointer to byte following character packet */
- register BYTE flag_byte;
- UNSIGN32 packet_length;
- long start_of_packet; /* pointer to start of character packet */
- register struct char_entry *tcharptr;/* temporary char_entry pointer */
- register UNSIGN32 the_char;
-
- /* Read a PK file, extracting character metrics and raster
- locations. */
-
- /******************************************************************/
-
- /* Process the preamble parameters */
-
- (void)REWIND(fontfp); /* start at beginning of file */
- if ((BYTE)nosignex(fontfp,(BYTE)1) != PKPRE)
- {
- (void)warning("readpk(): PK font file does not start with PRE byte");
- return(EOF);
- }
- if ((BYTE)nosignex(fontfp,(BYTE)1) != PKID)
- {
- (void)warning(
- "readpk(): PK font file PRE byte not followed by ID byte");
- return(EOF);
- }
-
- if (FSEEK(fontfp,(long)nosignex(fontfp,(BYTE)1),1))
- {
- (void)warning("readpk(): PK font file has garbled comment string");
- return(EOF); /* skip comment string */
- }
-
- fontptr->designsize = nosignex(fontfp,(BYTE)4);
-
- checksum = nosignex(fontfp,(BYTE)4); /* checksum */
- if ((fontptr->c != 0L) && (checksum != 0L) && (fontptr->c != checksum))
- {
- (void)sprintf(message,
- "readpk(): font [%s] has checksum = 10#%010lu [16#%08lx] [8#%011lo] \
- different from DVI checksum = 10#%010lu [16#%08lx] [8#%011lo]. \
- TeX preloaded .fmt file is probably out-of-date with respect to new fonts.",
- fontptr->name, fontptr->c, fontptr->c, fontptr->c,
- checksum, checksum, checksum);
- (void)warning(message);
- }
-
- fontptr->hppp = (UNSIGN32)nosignex(fontfp,(BYTE)4);
- fontptr->vppp = (UNSIGN32)nosignex(fontfp,(BYTE)4);
-
- fontptr->min_m = 0L; /* these are unused in PK format */
- fontptr->max_m = 0L;
- fontptr->min_n = 0L;
- fontptr->max_n = 0L;
-
- fontptr->magnification = (UNSIGN32)( 0.5 + 5.0 * 72.27 *
- (float)(fontptr->hppp) / 65536.0 ); /* from GFtoPXL Section 53 */
-
- /******************************************************************/
- /* Process the characters until the POST byte is reached */
-
- (void)skpkspec(); /* skip any PK specials */
-
- start_of_packet = (long)FTELL(fontfp);
- while ((flag_byte = (BYTE)nosignex(fontfp,(BYTE)1)) != PKPOST)
- {
- flag_byte &= 0x07;
- switch(flag_byte) /* flag_byte is in 0..7 */
- {
- case 0:
- case 1:
- case 2:
- case 3: /* short character preamble */
- packet_length = (UNSIGN32)flag_byte;
- packet_length <<= 8;
- packet_length += (UNSIGN32)nosignex(fontfp,(BYTE)1);
- the_char = (UNSIGN32)nosignex(fontfp,(BYTE)1);
- if (the_char >= NPXLCHARS)
- {
- (void)warning(
- "readpk(): PK font file character number is too big for me");
- return(EOF);
- }
- tcharptr = &(fontptr->ch[the_char]);
- end_of_packet = (long)FTELL(fontfp) + (long)packet_length;
- tcharptr->tfmw = (UNSIGN32)(((float)nosignex(fontfp,(BYTE)3) *
- (float)fontptr->s) / (float)(1L << 20));
- tcharptr->dx = (INT32)nosignex(fontfp,(BYTE)1) << 16;
- tcharptr->dy = 0L;
- tcharptr->pxlw = (UNSIGN16)PIXROUND(tcharptr->dx, 1.0/65536.0);
- tcharptr->wp = (COORDINATE)nosignex(fontfp,(BYTE)1);
- tcharptr->hp = (COORDINATE)nosignex(fontfp,(BYTE)1);
- tcharptr->xoffp = (COORDINATE)signex(fontfp,(BYTE)1);
- tcharptr->yoffp = (COORDINATE)signex(fontfp,(BYTE)1);
- break;
-
- case 4:
- case 5:
- case 6: /* extended short character preamble */
- packet_length = (UNSIGN32)(flag_byte & 0x03);
- packet_length <<= 16;
- packet_length += (UNSIGN32)nosignex(fontfp,(BYTE)2);
- the_char = (UNSIGN32)nosignex(fontfp,(BYTE)1);
- if (the_char >= NPXLCHARS)
- {
- (void)warning(
- "readpk(): PK font file character number is too big for me");
- return(EOF);
- }
- tcharptr = &(fontptr->ch[the_char]);
- end_of_packet = (long)FTELL(fontfp) + (long)packet_length;
- tcharptr->tfmw = (UNSIGN32)(((float)nosignex(fontfp,(BYTE)3) *
- (float)fontptr->s) / (float)(1L << 20));
- tcharptr->dx = (INT32)nosignex(fontfp,(BYTE)2) << 16;
- tcharptr->dy = 0L;
- tcharptr->pxlw = (UNSIGN16)PIXROUND(tcharptr->dx, 1.0/65536.0);
- tcharptr->wp = (COORDINATE)nosignex(fontfp,(BYTE)2);
- tcharptr->hp = (COORDINATE)nosignex(fontfp,(BYTE)2);
- tcharptr->xoffp = (COORDINATE)signex(fontfp,(BYTE)2);
- tcharptr->yoffp = (COORDINATE)signex(fontfp,(BYTE)2);
- break;
-
- case 7: /* long character preamble */
- packet_length = (UNSIGN32)nosignex(fontfp,(BYTE)4);
- the_char = (UNSIGN32)nosignex(fontfp,(BYTE)4);
- if (the_char >= NPXLCHARS)
- {
- (void)warning(
- "readpk(): PK font file character number is too big for me");
- return(EOF);
- }
- tcharptr = &(fontptr->ch[the_char]);
- end_of_packet = (long)FTELL(fontfp) + (long)packet_length;
- tcharptr->tfmw = (UNSIGN32)(((float)nosignex(fontfp,(BYTE)4) *
- (float)fontptr->s) / (float)(1L << 20));
- tcharptr->dx = (INT32)signex(fontfp,(BYTE)4);
- tcharptr->dy = (INT32)signex(fontfp,(BYTE)4);
- tcharptr->pxlw = (UNSIGN16)PIXROUND(tcharptr->dx, 1.0/65536.0);
- tcharptr->wp = (COORDINATE)nosignex(fontfp,(BYTE)4);
- tcharptr->hp = (COORDINATE)nosignex(fontfp,(BYTE)4);
- tcharptr->xoffp = (COORDINATE)signex(fontfp,(BYTE)4);
- tcharptr->yoffp = (COORDINATE)signex(fontfp,(BYTE)4);
- break;
- } /* end switch */
- tcharptr->fontrp = start_of_packet;
- (void)FSEEK(fontfp,end_of_packet,0); /* position to end of packet */
- (void)skpkspec(); /* skip any PK specials */
- start_of_packet = (long)FTELL(fontfp);
- } /* end while */
-
- #if (BBNBITGRAPH | HPJETPLUS | POSTSCRIPT | IMPRESS | CANON_A2)
- (void)newfont();
- #endif
-
- return(0);
- }
-